-*- mode: lisp-data -*-

text-mode :when (and (fboundp 'git-commit-mode) git-commit-mode)

(add\ "gnu: Add "
      (p (with-temp-buffer
           (magit-git-wash #'magit-diff-wash-diffs
             "diff" "--staged")
           (goto-char (point-min))
           (when (re-search-forward "\\+(define-public \\(\\S-+\\)"
                                    nil 'noerror)
             (match-string-no-properties 1)))
         var)
      "." n n
      "* " (p (or (car (magit-staged-files)) ""))
      " (" (s var ) "): New variable.")

(remove\ "gnu: Remove "
         (p (with-temp-buffer
              (magit-git-wash #'magit-diff-wash-diffs
                "diff" "--staged")
              (goto-char (point-min))
              (when (re-search-forward "\\-(define-public \\(\\S-+\\)"
                                       nil 'noerror)
                (match-string-no-properties 1)))
            var)
         "." n n
         "* " (p (or (car (magit-staged-files)) ""))
         " (" (s var) "): Delete variable.")

(rename\ "gnu: "
         (p (with-temp-buffer
              (magit-git-wash #'magit-diff-wash-diffs
                "diff" "--staged")
              (beginning-of-buffer)
              (when (search-forward "-(define-public " nil 'noerror)
                (thing-at-point 'sexp 'no-properties)))
            prev-var)
         ": Rename package to "
         (p (with-temp-buffer
              (magit-git-wash #'magit-diff-wash-diffs
                "diff" "--staged")
              (beginning-of-buffer)
              (when (search-forward "+(define-public " nil 'noerror)
                (thing-at-point 'sexp 'no-properties)))
            new-var)
         "." n n
         "* " (p (or (car (magit-staged-files)) "")) " (" (s prev-var) "): "
         "Define in terms of" n
         "'deprecated-package'." n
         "(" (s new-var) "): New variable, formerly known as \""
         (s prev-var) "\".")

(update\ "gnu: "
         (p (with-temp-buffer
              (magit-git-wash #'magit-diff-wash-diffs
                "diff" "--staged")
              (goto-char (point-min))
              (when (re-search-forward "^[ ]*(define-public \\(\\S-+\\)"
                                       nil 'noerror)
                (match-string-no-properties 1)))
            var)
         ": Update to "
         (p (with-temp-buffer
              (magit-git-wash #'magit-diff-wash-diffs
                "diff" "--staged")
              (goto-char (point-min))
              (search-forward "name" nil 'noerror)
              (search-forward "+" nil 'noerror)   ; first change
              (when (and (search-forward "version " nil 'noerror)
                         (looking-at-p "\""))
                (let ((end (save-excursion (search-forward "\")"
                                                           nil 'noerror))))
                  (when end
                    (forward-char)
                    (buffer-substring-no-properties (point) (- end 2))))))
            version)
         "." n n
         "* " (p (or (car (magit-staged-files)) "")) " (" (s var) "): "
         "Update to " (s version) "." n
         (mapconcat (lambda (file) (concat "* " file))
                    (cdr (magit-staged-files))
                    "\n"))

(addcl\ "gnu: Add cl-"
        (p (replace-regexp-in-string
            "^cl-" "" (with-temp-buffer
                        (magit-git-wash #'magit-diff-wash-diffs
                          "diff" "--staged")
                        (beginning-of-buffer)
                        (when (search-forward "+(define-public " nil 'noerror)
                          (replace-regexp-in-string
                           "^sbcl-" ""
                           (thing-at-point 'sexp 'no-properties)))))
           var)
        "." n n
        "* " (p (or (car (magit-staged-files)) ""))
        " (cl-" (s var)
        ", ecl-" (s var)
        ", sbcl-" (s var) "): New variables.")

(https\ "gnu: "
        (p (with-temp-buffer
             (magit-git-wash #'magit-diff-wash-diffs
               "diff" "--staged")
             (goto-char (point-min))
             (when (re-search-forward "^[ ]*(define-public \\(\\S-+\\)"
                                      nil 'noerror)
               (match-string-no-properties 1)))
           var)
        ": Use HTTPS home page." n n
        "* " (p (or (car (magit-staged-files)) ""))
        " (" (s var) ")[home-page]: Use HTTPS."
        n
        (mapconcat (lambda (file) (concat "* " file))
                   (cdr (magit-staged-files))
                   "\n"))

(move\ "gnu: "
       (p (with-temp-buffer
            (magit-git-wash #'magit-diff-wash-diffs
              "diff" "--staged")
            (goto-char (point-min))
            (when (re-search-forward "\\-(define-public \\(\\S-+\\)"
                                     nil 'noerror)
              (match-string-no-properties 1)))
          var)
       ": Move to ("
       (p (with-temp-buffer
            (magit-git-wash #'magit-diff-wash-diffs
              "diff" "--staged")
            (goto-char (point-min))
            (when (and
                   (re-search-forward "\\+(define-public \\(\\S-+\\)"
                                      nil 'noerror)
                   (re-search-backward "modified[ ]*\\(\\S-+\\)"
                                       nil 'noerror))
              (string-replace
               "\.scm" ""
               (string-replace "/" " "
                               (match-string-no-properties 1)))))
          new-module)
       ")." n
       n
       "* " (p (with-temp-buffer
                  (magit-git-wash #'magit-diff-wash-diffs
                    "diff" "--staged")
                  (goto-char (point-min))
                  (when (and
                         (re-search-forward "\\-(define-public \\(\\S-+\\)"
                                            nil 'noerror)
                         (re-search-backward "modified[ ]*\\(\\S-+\\)"
                                             nil 'noerror))
                    (match-string-no-properties 1)))
                source)
       " (" (s var) "): Move from here…" n
       "* " (concat (string-replace " " "/" new-module) ".scm")
       " (" (s var) "): …to here.")
